{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "def improved_euler(f, a, b, h, y0):\n",
    "    \"\"\"改进欧拉法\n",
    "\n",
    "    用**改进欧拉法**求如下常微分方程初值问题的数值解:\n",
    "\n",
    "        y'(x) = f(x, y)  (a <= x <= b)\n",
    "        y(a) = y_0\n",
    "\n",
    "    This function returns a generator that does lazy calculations，\n",
    "    which generates solutions (x, y) of the equation for x from a to b by step h.\n",
    "\n",
    "    Args:\n",
    "\n",
    "        f: 二元函数，y'(x) = f(x, y)\n",
    "        a, b: float, x 的区间\n",
    "        h: float , x 迭代步：x_0 = a，x_1 = x_0 + h, x_2 = x_1 + h, ..., x_n = x_{n-1} + h = b\n",
    "        y0: float, 初值 y(a)\n",
    "\n",
    "    Yields:\n",
    "\n",
    "        (x, y)：方程的解 for x from a to b, step h.\n",
    " \n",
    "    Raises:\n",
    "\n",
    "        ValueError: (b < a) or (h <= 0)\n",
    "    \"\"\"\n",
    "    if b < a:\n",
    "        raise ValueError(\"unexpected range [a, b] where b < a\")\n",
    "    if h <= 0:\n",
    "        raise ValueError(\"unexpected step h <= 0\")\n",
    "    \n",
    "    x = a\n",
    "    y = y0\n",
    "\n",
    "    while x <= b or abs(b - x) < 1e-14:    # x <= b\n",
    "        yield (x, y)\n",
    "\n",
    "        y_next_g = y + h * f(x, y)\n",
    "        y_next = y + h * ( f(x, y) + f(x+h, y_next_g) ) / 2\n",
    "        \n",
    "        x = x + h\n",
    "        y = y_next"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\t0.5\n",
      "0.1\t0.657\n",
      "0.2\t0.828435\n",
      "0.30000000000000004\t1.013720675\n",
      "0.4\t1.2122113458750001\n",
      "0.5\t1.4231935371918751\n"
     ]
    }
   ],
   "source": [
    "rs = improved_euler(lambda x, y: y - x**2 + 1, a=0, b=0.5, h=0.1, y0=0.5)\n",
    "for r in rs:\n",
    "    print(r[0],r[1], sep='\\t')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def runge_kutta(f, a, b, h, y0):\n",
    "    \"\"\"四阶龙格-库塔法的算法: (generally referred to as RK4)\n",
    "\n",
    "    用经典**四阶龙格-库塔算法**求如下常微分方程初值问题的数值解:\n",
    "\n",
    "        y'(x) = f(x, y)  (for a <= x <= b)\n",
    "        y(a) = y_0\n",
    "\n",
    "    This function returns a generator that does lazy calculations，\n",
    "    which generates solutions (x, y) of the equation for x from a to b by step h.\n",
    "\n",
    "    Args:\n",
    "\n",
    "        f: 二元函数，y'(x) = f(x, y)\n",
    "        a, b: float, x 的区间\n",
    "        h: float , x 迭代步：x_0 = a，x_1 = x_0 + h, x_2 = x_1 + h, ..., x_n = x_{n-1} + h = b\n",
    "        y0: float, 初值 y(a)\n",
    "\n",
    "    Yields:\n",
    "\n",
    "        (x, y)：方程的解 for x from a to b, step h.\n",
    " \n",
    "    Raises:\n",
    "\n",
    "        ValueError: (b < a) or (h <= 0)\n",
    "    \"\"\"\n",
    "    if b < a:\n",
    "        raise ValueError(\"unexpected range [a, b] where b < a\")\n",
    "    if h <= 0:\n",
    "        raise ValueError(\"unexpected step h <= 0\")\n",
    "    \n",
    "    x = a\n",
    "    y = y0\n",
    "\n",
    "    while x <= b or abs(b - x) < 1e-14:    # x <= b\n",
    "        yield (x, y)\n",
    "\n",
    "        k1 = f(x, y)\n",
    "        k2 = f(x + h / 2, y + h * k1 / 2)\n",
    "        k3 = f(x + h / 2, y + h * k2 / 2)\n",
    "        k4 = f(x + h, y + h * k3)\n",
    "        \n",
    "        x = x + h\n",
    "        y = y + h * (k1 + 2 * k2 + 2 * k3 + k4) / 6"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\t0.5\n",
      "0.1\t0.657414375\n",
      "0.2\t0.8292982759973958\n",
      "0.30000000000000004\t1.0150700584326051\n",
      "0.4\t1.2140869057030108\n",
      "0.5\t1.425638395648218\n"
     ]
    }
   ],
   "source": [
    "rs = runge_kutta(lambda x, y: y - x**2 + 1, a=0, b=0.5, h=0.1, y0=0.5)\n",
    "for r in rs:\n",
    "    print(r[0],r[1], sep='\\t')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def runge_kutta_fehlberg(f, a, b, h_min, h_max, y0, eps):\n",
    "    \"\"\"Runge-Kutta-Fehlberg 方法（RKF）\n",
    "\n",
    "    用 **Runge-Kutta-Fehlberg 方法**求如下常微分方程初值问题的数值解:\n",
    "\n",
    "        y'(x) = f(x, y)  (for a <= x <= b)\n",
    "        y(a) = y_0\n",
    "\n",
    "    This function returns a generator that does lazy calculations，\n",
    "    which generates solutions (x, y) of the equation for x from a to b by step h.\n",
    "\n",
    "    Args:\n",
    "\n",
    "        f: 二元函数，y'(x) = f(x, y)\n",
    "        a, b: float, x 的区间端点\n",
    "        h_min: float, 最小步长\n",
    "        h_max: float, 最大步长\n",
    "        y0: float, 初值 y(a)\n",
    "        eps: float >= 0，容许误差\n",
    "\n",
    "    Yields:\n",
    "\n",
    "        (x, y)：方程的解 for x from a to b, step h.\n",
    " \n",
    "    Raises:\n",
    "\n",
    "        ValueError: (b > a) or (h_max < h_min) or (eps < 0)\n",
    "        GeneratorExit: h_min too small. Failed to continue.\n",
    "\n",
    "    \"\"\"\n",
    "    if b < a:\n",
    "        raise ValueError(\"unexpected range [a, b] where b < a\")\n",
    "    if h_max < h_min:\n",
    "        raise ValueError(\"unexpected step h_max < h_min \")\n",
    "    if eps < 0:\n",
    "        raise ValueError(\"unexpected eps < 0\")\n",
    "\n",
    "    h = h_max\n",
    "\n",
    "    x = a\n",
    "    y = y0\n",
    "\n",
    "    yield (x, y)\n",
    "\n",
    "    while x <= b:\n",
    "        k1 = h * f(x, y)\n",
    "        k2 = h * f(x + h / 4, y + k1 / 4)\n",
    "        k3 = h * f(x + 3 * h / 8, y + 3 * k1 / 32 + 9 * k2/ 32)\n",
    "        k4 = h * f(x + 12 * h / 13, y + 1932 / 2197 * k1 - 7200 / 2197 * k2  + 7296 / 2197 * k3 )\n",
    "        k5 = h * f(x + h, y + 439 / 216 * k1 - 8 * k2 + 3680 / 513 * k3 - 845 / 4104 * k4)\n",
    "        k6 = h * f(x + h / 2, y - 8 / 27 * k1 + 2 * k2 - 3544 / 2565 * k3 + 1859 / 4104 * k4 - 11 / 40 * k5)\n",
    "\n",
    "        R = abs(k1 / 360 - 128 / 4275 * k3 - 2197 / 75240 * k4 + k5 / 50 + 2 / 55 * k6)\n",
    "\n",
    "        if R <= h * eps:\n",
    "            x = x + h\n",
    "            y = y + k1 * 25 / 216 + 1408 / 2565 * k3 + 2197 / 4104 * k4 - k5 / 5\n",
    "            yield (x, y)\n",
    "\n",
    "        delta = 0.84 * (eps * h / R) ** (1/4)\n",
    "\n",
    "        if delta <= 0.1:\n",
    "            h = 0.1 * h\n",
    "        elif delta >= 4:\n",
    "            h = 4 * h\n",
    "        else:\n",
    "            h = delta * h\n",
    "\n",
    "        if h > h_max:\n",
    "            h = h_max\n",
    "\n",
    "        if abs(x - b) < eps:\n",
    "            break\n",
    "        \n",
    "        if x + h > b:\n",
    "            h = b - x\n",
    "\n",
    "        if h < h_min:\n",
    "            raise GeneratorExit(\"h_min too small. Failed to continue.\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\t0.5\n",
      "0.13654362227564565\t0.7185790374592727\n",
      "0.26801219081330985\t0.954173517401745\n",
      "0.4012266303587918\t1.2166084183124863\n",
      "0.5366174380061863\t1.5060873731856972\n",
      "0.6747628968898941\t1.823047493996752\n",
      "0.8164946373311293\t2.1683758740655024\n",
      "0.9630852685641695\t2.5438210903808947\n",
      "1.116667783480386\t2.952954119903974\n",
      "1.2813817240537375\t3.4038972431729375\n",
      "1.467877999563017\t3.9204151719053937\n",
      "1.662648091115601\t4.453068120471034\n",
      "1.8154680775168273\t4.854886481689374\n",
      "1.967706858383927\t5.230159855113913\n",
      "2.0\t5.30547384382613\n"
     ]
    }
   ],
   "source": [
    "rs = runge_kutta_fehlberg(lambda x, y: y - x**2 + 1, a=0, b=2, h_min=0.01, h_max=0.5, y0=0.5, eps=1e-6)\n",
    "for r in rs:\n",
    "    print(r[0],r[1], sep='\\t')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 题目\n",
    "\n",
    "解题的类："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "class Question(object):\n",
    "    def __init__(self, f, a, b, h, y0, h_min, h_max, eps, actual_solution):\n",
    "        super().__init__()\n",
    "\n",
    "        self.f = f\n",
    "        self.a = a\n",
    "        self.b = b\n",
    "        self.h = h\n",
    "        self.actual_solution = actual_solution\n",
    "\n",
    "        self.args_rk = [f, a, b, h, y0]\n",
    "        self.args_rkf = [f, a, b, h_min, h_max, y0, eps]\n",
    "\n",
    "        self.results = {}\n",
    "\n",
    "    def __do_rk(self, method):\n",
    "        # print(method.__name__, '\\n' + '-' * 25)\n",
    "\n",
    "        rs = method(*self.args_rk)\n",
    "\n",
    "        self.results[method.__name__] = list(rs)\n",
    "        for r in self.results[method.__name__]:\n",
    "            print(r[0],r[1], sep='\\t')\n",
    "\n",
    "    def __do_rkf(self, method):\n",
    "        # print(method.__name__, '\\n' + '-' * 25)\n",
    "\n",
    "        rs = method(*self.args_rkf)\n",
    "\n",
    "        self.results[method.__name__] = list(rs)\n",
    "        for r in self.results[method.__name__]:\n",
    "            print(r[0],r[1], sep='\\t')\n",
    "\n",
    "    def __plot(self):\n",
    "        # 真解\n",
    "        xs = [self.a + k * (self.b - self.a) / 100 for k in range(101)]\n",
    "        ys = [actual_solution(x) for x in xs]\n",
    "        plt.plot(xs, ys, 'r-', linewidth=3, label='actual_solution')\n",
    "\n",
    "        # 各种数值解\n",
    "        styles = (s for s in ['bo-', 'ys-', 'g^-'])\n",
    "        for k in self.results:\n",
    "            xs, ys = list(zip(*self.results[k]))\n",
    "            plt.plot(xs, ys, next(styles), label=k)\n",
    "\n",
    "        plt.legend()\n",
    "\n",
    "    def solve(self):\n",
    "        print('\\nImproved Euler：')\n",
    "        self.__do_rk(improved_euler)\n",
    "        print('\\nRK4：')\n",
    "        self.__do_rk(runge_kutta)\n",
    "        print('\\nRKF：')\n",
    "        self.__do_rkf(runge_kutta_fehlberg)\n",
    "        \n",
    "        # 绘制整体\n",
    "        self.__plot()\n",
    "        plt.show()\n",
    "\n",
    "        # 绘制一个局部\n",
    "        self.__plot()\n",
    "        plt.xlim(self.b - self.h, self.b)\n",
    "        y1, y2 = self.actual_solution(self.b - self.h), self.actual_solution(self.b)\n",
    "        plt.ylim(min(y1, y2), max(y1, y2))\n",
    "        plt.legend()\n",
    "        plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. a).\n",
    "\n",
    "$$\n",
    "\\begin{cases}\n",
    "\\frac{dy}{dx}=y^2\\\\\n",
    "y(0) = 1\n",
    "\\end{cases}\n",
    "\\quad 0.1\\le x \\le 0.4\n",
    "\\quad h=0.1\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Improved Euler：\n",
      "0\t1\n",
      "0.1\t1.1105\n",
      "0.2\t1.2482762285866027\n",
      "0.30000000000000004\t1.4247601260213614\n",
      "0.4\t1.6587363946557603\n",
      "\n",
      "RK4：\n",
      "0\t1\n",
      "0.1\t1.1111104900521944\n",
      "0.2\t1.2499979920470152\n",
      "0.30000000000000004\t1.4285661863014445\n",
      "0.4\t1.6666532572503225\n",
      "\n",
      "RKF：\n",
      "0\t1\n",
      "0.025039979795246234\t1.0256830838146338\n",
      "0.05023788001716733\t1.052895224207251\n",
      "0.07449021044767089\t1.080485600141923\n",
      "0.09781031904296066\t1.1084143630136087\n",
      "0.12024490661926406\t1.1366799785401573\n",
      "0.1418387901059162\t1.1652822211726135\n",
      "0.16263399033424697\t1.194220913397017\n",
      "0.1826699094328344\t1.2234958832046705\n",
      "0.20198352501286038\t1.253106962683577\n",
      "0.22060956834055725\t1.2830539876206315\n",
      "0.23858068763984974\t1.3133367976484365\n",
      "0.2559275973202766\t1.3439552358985725\n",
      "0.27267921507337145\t1.3749091491644632\n",
      "0.2888627873258841\t1.4061983873896555\n",
      "0.3045040049273295\t1.4378228039555951\n",
      "0.31962710915217313\t1.4697822551801247\n",
      "0.33425498973396817\t1.5020766007259563\n",
      "0.3484092747167351\t1.5347057029264364\n",
      "0.3621104137928546\t1.5676694270969493\n",
      "0.37537775507854887\t1.6009676414571847\n",
      "0.38822961593386085\t1.634600216668164\n",
      "0.4\t1.6666666707061184\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def f(x, y):\n",
    "    return y ** 2\n",
    "\n",
    "a, b = 0, 0.4\n",
    "h = 0.1\n",
    "y0 = 1\n",
    "h_min=0.001\n",
    "h_max=0.5\n",
    "eps=1e-8\n",
    "\n",
    "def actual_solution(x):\n",
    "    return 1 / (1 - x)\n",
    "\n",
    "#  def __init__(self, f, a, b, h, y0, h_min, h_max, eps, actual_solution):\n",
    "q1 = Question(f, a, b, h, y0, h_min, h_max, eps, actual_solution)\n",
    "q1.solve()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. b)\n",
    "\n",
    "$$\n",
    "\\begin{cases}\n",
    "\\frac{dy}{dx}=x/y\\\\\n",
    "y(2.0) = 1\n",
    "\\end{cases}\n",
    "\\quad 2.0\\le x \\le 2.6\n",
    "\\quad h=0.1\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Improved Euler：\n",
      "2.0\t1\n",
      "2.1\t1.1875\n",
      "2.2\t1.3565459923557568\n",
      "2.3000000000000003\t1.5133558178802287\n",
      "2.4000000000000004\t1.6614034116615422\n",
      "2.5000000000000004\t1.802850617838112\n",
      "2.6000000000000005\t1.9391431095639506\n",
      "\n",
      "RK4：\n",
      "2.0\t1\n",
      "2.1\t1.1874362471788942\n",
      "2.2\t1.3564683099780293\n",
      "2.3000000000000003\t1.513276851413264\n",
      "2.4000000000000004\t1.6613269035807452\n",
      "2.5000000000000004\t1.8027776370912958\n",
      "2.6000000000000005\t1.9390738201189597\n",
      "\n",
      "RKF：\n",
      "2.0\t1\n",
      "2.0211724308032437\t1.0416995703232401\n",
      "2.0415542156639184\t1.080714400351875\n",
      "2.063772665098076\t1.1221219241586564\n",
      "2.0878610104513116\t1.16583171952646\n",
      "2.1140161190991194\t1.212049566189454\n",
      "2.142450034889673\t1.2609885609556355\n",
      "2.173401878648306\t1.3128883138785854\n",
      "2.2071414713667057\t1.3680180820976793\n",
      "2.243974231145123\t1.4266815860724658\n",
      "2.2842469848065763\t1.4892227117613641\n",
      "2.3283549439053477\t1.5560323717778588\n",
      "2.3767501221468326\t1.6275568008106627\n",
      "2.429951552025518\t1.7043076428256803\n",
      "2.488557762018454\t1.7868742906237765\n",
      "2.553262116784645\t1.875939080006759\n",
      "2.6\t1.9390719416220605\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAD8CAYAAACYebj1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3Xl8TNf/x/HXyR4SIUTsQktIgthS1Ra1V+3UFkskEWrfilJLqV8VbRVFU1XV+qoWLd1pSylqq7X2XQiSIBKRdc7vj0SKioRMcjPxeT4eedTcbT5zmsx7ztx7z1Faa4QQQggAK6MLEEIIkXdIKAghhEgnoSCEECKdhIIQQoh0EgpCCCHSSSgIIYRIJ6EghBAinYSCEEKIdBIKQggh0tkYXcCDFCtWTHt4eBhdhhBC5F0pKcTE7SPsNsQlAzdAx2mV3cPmyVDw8PBg9+7dRpchhBB509q1/Dp5KuMHwfHracs+Ms+h82QoCCGEeIDwcOIHDyO44FG+6XSQ+Oup5wBMZnwKOacghBB5ndaweDGrXmpBdd+fWf7UQTysClDW3ryBANJTEEKIvO3ECaL7vUqfKhf5seNR7BQMO1ea91QzrGa9C66uAKgpao85ns5iQiEpKYmwsDDi4+ONLkVYEAcHB8qUKYOtra3RpQjxaJKSYPZsQtes4K12J7mQcpu6yplPfipBtakLoUmTHHlaiwmFsLAwnJ2d8fDwQKlsn2AXTwCtNVFRUYSFhVGhQgWjyxEi63btIjxkID0bXGdT61O4KMWUo2WZVK4basMUKFAgx57aYkIhPj5eAkE8EqUURYsWJSIiwuhShMiaW7dg0iRm7FzP+52OcTUliUbalaW/lqP8e0ugZs0cL8GiTjRLIIhHJb8zwmL88gsnatfjWeuveb3pIaysU5i7vzwbncdTfsOuXAkEsKCeghBC5EuRkegRIxkbsZePex7hZkoKbRKL8+kuL4rO/QQqVszVciyqpyCEEPmG1rB8ObvrPYtvufXMevYQRWwUy3ZWZF3lmRT97vdcDwSQUMgRmzZtYtu2bdk6hpOTk5mqSb1DPDIy8qHbLF26lEuXLqU/Dg4O5vDhw2arQQhxl7NnMb30Ev3WvE2jPqc46nCF7rGlOHioPf6fboc+fcCgrz4lFHKAOUIht90fCosXL8bLy8vAioTIh1JSYM4cNjRrTJVndrK4+j+Ut7Xj262e/O/Fjyn4xddQvLihJVpmKCiVcz8P0b59e2rXro23tzehoaEA/Pzzz9SqVYsaNWrQpEkTzp49y6JFi3j//ffx9fVly5YtBAQEsGrVqvTj3OkFxMbG0qRJE2rVqkW1atVYu3Ztll5+eHg4DRo0wNfXFx8fH7Zs2QLAihUrqFatGj4+PowdO/Y/+509exYfH5/0x7Nnz2bKlCmsWrWK3bt34+/vj6+vL7dv36ZRo0bp409ldFwnJycmTJhAjRo1qFevHleuXMlS/UI8kQ4eJL5+fbr8/RGte53hou11+keVZd/lQF76ehe0amV0ham01nnup3bt2vp+hw8f/vdB6rdxOfPzEFFRUVprrePi4rS3t7e+fPmyLlOmjD59+vQ96ydPnqxnzZqVvl+fPn30119/nf64YMGCWmutk5KSdHR0tNZa64iICP3UU09pk8l0zzYPMnv2bP3WW29prbVOTk7WN2/e1BcvXtRly5bVV69e1UlJSfrFF1/U33zzjdZa6/Lly+uIiAh95swZ7e3tnX6cWbNm6cmTJ2uttW7YsKHetWtX+ro7jx92XECvW7dOa631a6+9pqdNm/bQ9jPKPb87QuS227e1njBBf1m1oi47xUkzBV3n7QJ6a8saWm/fbranAXZrM7z/WmZPwSBz585N/1R84cIFQkNDadCgQfqNUa5pt5tnldaa8ePHU716dZo2bcrFixez9Gm7bt26fPrpp0yZMoWDBw/i7OzMrl27aNSoEW5ubtjY2ODv78/mzZsf63Xe7WHHtbOzo3Xr1gDUrl2bs2fPZvv5hMhXtmzhRq1atIxYSY+up4m1jWXMRQ/+ShhN/bU7oV49oyv8D8u8JFXrXH/KTZs28euvv7J9+3YKFChAo0aN8PX15ejRo5nua2Njg8mUOmyVyWQiMTERgOXLlxMREcGePXuwtbXFw8MjS8N4NGjQgM2bN/PDDz8QEBDAyJEjcXFxeaQ6gGwPGWJra5t+H4C1tTXJycnZOp4Q+UZ0NIwbx4Kdv/Bmt3Cu6nga2rkwf5s3PjMXQ9WqRleYIekpZFF0dDRFihShQIECHD16lL/++ov4+Hg2b97MmTNnALh27RoAzs7OxMTEpO/r4eHBnj2pY1WtW7eOpKSk9GMWL14cW1tbNm7cyLlz57JUy7lz53B3d6dfv34EBwfz999/4+fnxx9//EFkZCQpKSmsWLGChg0b3rOfu7s7V69eJSoqioSEBL7//vv0dffXfEdWjiuEuMvatVyqUYPnbX9iUNszWNkm8H+nn2Zj4en4rN2SpwMBLLWnYICWLVuyaNEiqlatiqenJ/Xq1cPNzY3Q0FA6duyIyWSiePHibNiwgTZt2tC5c2fWrl3LvHnz6NevH+3ataNGjRq0bNmSggULAuDv70+bNm2oVq0aderUoUqVKlmqZdOmTcyaNQtbW1ucnJxYtmwZJUuWZMaMGbz44otorXn55Zdp167dPfvZ2toyadIk/Pz8KF269D3PFxAQwIABA3B0dGT79u3py7NyXCEEcPkyDBnCW1f28W7QRW6akmllXZQF++pS/t2PoUwZoyvMEqUN+ComM3Xq1NH3z7x25MgRqubxhBV5k/zuiBylNSxZwrEpk+jWTbPPKRwPByvG7qtE/45TUZ1fyZV7DpRSe7TWdbJ7HOkpCCHE4zp5Eh3SjxH2F1nc7zKJmOiSXIIPTzej2Idz0uc6sCQSCnnYwYMH6dWr1z3L7O3t2bFjh0EVCSGA1LkO3nuPnR++R6+eJo7bR1LVwYZJu7zpNuD9HJvrIDdIKORh1apVY9++fUaXIYS42549JAcFEfT0LVYGR2Btpel7qyxzb3fC6bPpOTrXQW6QUBBCiKyIi4PJk/lp1TIG9EzgvE00tR3tmb6zOi1eXwS1ahldoVnIJalCCJGZX38lrroP7a6soU3AVW46RjPsZgW26om0WLEt3wQCSE9BCCEydu0ajB7N8r9+ZmTPaK6qOBoULMiMPX48Oy0Unn7a6ArNTnoKQghxP63hq6+IqlaVxja/07NrOMohjkkRlfm9yHs8+7/f8mUgQBZCQSm1RCl1VSl1KIP1RZRS3yilDiildiqlfNKWl1VKbVRKHVZK/aOUGmbu4h9m+XLw8AArq9T/Ll+e/WPWr18/+wfJRfePzppdmzZtSh/rSIh8KywM2rVj7qxRPB1yg02lz/GSowu/Hm/Pm2/8gXVQiGFzHeSGrPQUlgItH7J+PLBPa10d6A18kLY8GRiltfYC6gGDlFK5MkD/8uUQEgLnzqUG/rlzqY+zGww5MUdCfh4vKD+/NpEPmUywcCHna1ejrscehrUOo7BjErMuevN95SX4LPkGSpQwusocl2koaK03A9cesokX8HvatkcBD6WUu9Y6XGv9d9ryGOAIUDr7JcPw4dCoUcY/QUGpFwrcLS4udXlG+wwfnvnz3pkHYdOmTTRs2JB27dpRsWJFxo0bx/Lly/Hz86NatWqcOnUK+HfoiDp16lC5cuX0sYaWLl1K27Ztady4MU2aNEFrzWuvvYaPjw/VqlVj5cqVAHTr1o0ffvgh/fnvfPJPSUnhtddeo27dulSvXp2PPvoISB11dfDgwXh6etK0aVOuXr360NezZ88eGjZsSO3atWnRogXh4eEA98ylEBkZiYeHx3/2vXXrFoGBgfj5+VGzZs30uSDuf21CWISjR9ENGzBp5dt4DYphf7FLdLYrxsawPoyatRWr9h2NrjDXmONE836gI7BFKeUHlAfKAOljQCulPICaQK7cdZWQ8GjLH8f+/fs5cuQIrq6uVKxYkeDgYHbu3MkHH3zAvHnzmDNnDpA6sc3OnTs5deoUL774IidPngTg77//5sCBA7i6urJ69Wr27dvH/v37iYyMpG7dujRo0ICuXbvy1Vdf8fLLL5OYmMhvv/3GwoUL+eSTT3BxcWHXrl0kJCTw3HPP0bx5c/bu3cuxY8c4fPgwV65cwcvLi8DAwAfWn5SUxJAhQ1i7di1ubm6sXLmSCRMmsGTJkiy9/unTp9O4cWOWLFnCjRs38PPzo2nTpv95bULkaYmJMHMm/8ybySu9HDjiHEHVAlaMOFyL4ID3UQ0aGF1hrjNHKMwAPlBK7QMOAnuBlDsrlVJOwGpguNb6ZkYHUUqFACEA5cqVe+gTpr3fZsjDI/Uro/uVLw+bNj1836yqW7cuJUuWBOCpp56iefPmQOoNZxs3bkzfrkuXLlhZWVGpUiUqVqyYPtR2s2bN0t80//zzT7p37461tTXu7u40bNiQXbt28dJLLzFs2DASEhL4+eefadCgAY6Ojqxfv54DBw6kny+Ijo7mxIkTbN68Of04pUqVonHjxhnWf+zYMQ4dOkSzZs0ASElJSX89WbF+/XrWrVvH7NmzgdRhuM+fP/+f1yZEnrVzJynBQQwtc5NPBt3CyiqGProks250x23BdHBwMLpCQ2Q7FNLe6PsCqNTB9c8Ap9Me25IaCMu11msyOU4oEAqpA+Jlp6bp01PPIdz9FVKBAqnLzcXe3j7931ZWVumPrays7vkuXd13QurO4zsjpT6Mg4MDjRo14pdffmHlypV069YNSP2aaN68ebRo0eKe7X/88ccs16+1xtvb+54RUe+4e96FjOZc0FqzevVqPD0971m+Y8eOLL02IQxz6xZMnMjWlYvx723NOYcb1HayYczBerwyfAGqRg2jKzRUti9JVUoVVkrZpT0MBjZrrW+mBcQnwBGt9XvZfZ5H4e8PoaGpPQOlUv8bGpq6PLd9/fXXmEwmTp06xenTp//zJgrwwgsvsHLlSlJSUoiIiGDz5s34+fkB0LVrVz799FO2bNlCy5ap5/tbtGjBwoUL0+dlOH78OLdu3aJBgwbpxwkPD7+nx3I/T09PIiIi0kMhKSmJf/75B7h3/oeMrl5q0aIF8+bN484ou3v37n2c5hEid/3yCwnVvel+YTUNQ2K44XyDgcnl+c00hS6LNz/xgQBZ6CkopVYAjYBiSqkwYDJgC6C1XgRUBT5TSmngHyAobdfngF7AwbSvlgDGa62z/nE2G/z9jQmB+5UrVw4/Pz9u3rzJokWLcHhAl7RDhw5s376dGjVqoJRi5syZlEi7yqF58+b06tWLdu3aYWeXmr3BwcGcPXuWWrVqobXGzc2Nb7/9lg4dOvD777/j5eVFuXLlePbZZzOsy87OjlWrVjF06FCio6NJTk5m+PDheHt7M3r0aLp06UJoaCgvv/zyA/efOHEiw4cPp3r16phMJipUqHDPpD1C5ClRUTBiBOu2fUdIj2Su2MTSoJAD4w88T4tJoZA2pa6Q+RRyVEBAAK1bt6Zz585Gl/JEs8TfHWEmWsOXX3Jz1BC6NHNkfcUw3Oyh741KTPYcjWNAv3xzz4HMpyCEEA9z/jwMHMin5/5iZL9bRFtF0dLFiYnHmvHsm4ugeHGjK8yTJBRy0NKlS40uAUj9eurOPNJ3vPPOO/85US1EvmAywYIFXHlzHB06FmJ73SjKOcLoKz6MqTkZ2+HSc38YCYUnwDfffGN0CULkjsOH0cFBzDKdYuqgRBKswunsVJhJF9pT7c0PoFAhoyvM8yQUhBCWLzERZszg1Nz/o71/IQ65RlDFSTHgbC0Gv/gu1iMbGV2hxZBQEEJYtr/+whQcxOvuUXwwJAllFUEfRzcmRftTcfYMuOueIpE5CQUhhGWKjYU33uDv/y2gcx8nzjhdp7aLFQNP1KfvgAWoanLPweOQ+RQszN2D1WXFt99+y+HDh9MfL126lEuXLuVEaULknl9+IbG6N8GnVvLMoGSiCl9ngEMp1iVPJnDuZgmEbMiXPYWtW0uQlHTlP8ttbd157rnL2T6+1hqtNVZWeT9Tv/32W1q3bo2XV+qo5UuXLsXHx4dSpUoZXJkQjyEyEkaO5PdNX9Gzpx3h9jE0LGLDoGMN6Dx6MUpuQsu2vP+u9hgeFAgPW54VZ8+exdPTk969e+Pj44O1tXX6ulWrVhEQEACk3rA2dOhQ6tevT8WKFdOHiTCZTAwcOJAqVarQrFkzWrVqlb4uoyGsH8ZkMhEQEMAbb7wB/Dus9931bNu2jXXr1vHaa6/h6+vLO++8w+7du/H398fX15fbt28zdepU6tati4+PDyEhIeTFmxmFQGtYsYLYGlXpmLiBpkEJJBeKYZRVBdY4fcAr83+VQDATi+wpnDgxnNjYfZlv+AB79zZ64HInJ18qVXr48KsnTpzgs88+o169eve8Cd8vPDycP//8k6NHj9K2bVs6d+7MmjVrOHv2LIcPH+bq1atUrVqVwMDAxxrCOjk5GX9/f3x8fJgwYUKG29WvX5+2bdvec1f1Tz/9xOzZs6lTJ/XGx8GDBzNp0iQAevXqxffff0+bNm0e2g5C5Kq0m9C+OrmJAYEmrtvc5iVXe4aeaEmLCR+h3N2NrjBfschQMEr58uWpV69eptu1b98eKysrvLy8uHIltXfy559/8sorr2BlZUWJEiV48cUXgccbwrp///506dLloYGQVRs3bmTmzJnExcVx7do1vL29JRRE3pB2E1rUm+Po3NqJTXVvUdYRhsRWYXTZKTgP6Wp0hfmSRYZCZp/oN23KeCyTmjU3Pfbz3j0k9N1DYt8/vPTdw2pn9nXMw4awzkj9+vXZuHEjo0aNSh9g72H1ZCQ+Pp6BAweye/duypYty5QpU7K8rxA56sgRdHAQi24fYszAJG5bX6Gza0GGnevA85MWgLOz0RXmW/nynEJucHd358iRI5hMpizdMfzcc8+xevVqTCYTV65cYVPabD8PG8I6I0FBQbRq1YouXbqkz92QUT3Ozs7ExMQ88PGdAChWrBixsbEZDpMtRK5JTISpU7nwfA3qVD/BwHYxlHFJZPrtGnzu8w3Pz/pcAiGH5ctQsLV98HeMGS1/HDNmzKB169bUr18/SzOWderUiTJlyuDl5UXPnj2pVasWLi4u6UNYjx07lho1auDr68u2bdsyPd7IkSOpWbMmvXr1wmQyZVhPt27dmDVrFjVr1uTUqVPp80b7+vpib29Pv3798PHxoUWLFtStWzdbbSJEtuzYgal2Ld7c8D6Vhpj4p1QkfVxdWHFjEGOn7MChUTOjK3wiyNDZuSg2NhYnJyeioqLw8/Nj69at6fMmiJyTH3538rW0m9AOL59LB//CHC9ynVqFITDsGUL852HrKx9WskKGzrZArVu35saNGyQmJjJx4kQJBCHWryepfz9GVY5lwSAoYHudAU5ujEjoT+UZU+CuS79F7pBQyEV3ziNkxaBBg9i6des9y4YNG0bfvn3NXJUQBoiKgpEj2fbrF3TxL8jFgjE0KGpF37MN6dU9FOuKlYyu8IkloZBHffjhh0aXIIT5aQ1ffcWtEYMJeUazIsREUbsYRtqXYpjdaMrNGp5vZkKzVBIKQojcERYGAwfy/T8/ExBgS5R9HK3cbAg43Tx1iIoSmV+wIXJevrz6SAiRh5hMsGgR12pVpZXzNtr0TqJA4TjecKzIkmKLeWX2DxIIeYj0FIQQOefYMXRIP5Zd28mQ/nDLJpZX3O3pe6Y9LV9fhCpc2OgKxX0kFIQQ5peUBLNmcfG9N3mlvRPbyyZQyQkC4r0YWOH/KDygndEVigzI10cWxsj5FI4ePYqvr2/6jXAZyWiwwClTpjB79mzg0V+HsCB79mCqW4d3107n6UEm/i5/jYASBfg4Oojxo/ZQuIUEQl6WaSgopZYopa4qpQ5lsL6IUuobpdQBpdROpZTPXetaKqWOKaVOKqXGmbPwrAiPCafh0oZcjs3+HAp301pjMpnMesycYs5Q+Pbbb+ncuTN79+7lqaeeMleJj+zO0B4ij4mLgzFjONaiLtWfP8foVnFUdU1mRkot5vn+RMOpiyFtrC6Rd2Wlp7AUaPmQ9eOBfVrr6kBv4AMApZQ18CHwEuAFdFdKeWWr2kc0bfM0/jz/J9P+mJbtYz3p8yn8+OOPzJkzh4ULF6aP8PrFF1/g5+eHr68v/fv3JyUlJX37CRMmUKNGDerVq5c+Uuz9Pv/8c3x9ffHx8WHnzp0A3Lp1i8DAQPz8/KhZsyZr164FUsOsbdu2NG7cmCZNmjy0PYUBfv+dpBrVeH3XQnwGK86WiOZVdxdCb41k+Bs7cHqmgdEViizK9JyC1nqzUsrjIZt4ATPStj2qlPJQSrkDFYGTWuvTAEqpL4F2wOEMj5RFw38ezr7LD59PISE5gZ2XdmLSJhbtWcTey3uxs7bLcHvfEr7MaSnzKWQ0n0KrVq0YMGAATk5OjB49miNHjrBy5Uq2bt2Kra0tAwcOZPny5fTu3Ztbt25Rr149pk+fzpgxY/j444/Tw+tucXFx7Nu3j82bNxMYGMihQ4eYPn06jRs3ZsmSJdy4cQM/Pz+aNm0KwN9//82BAwdwdXVl1apVD2xPkctu3IDRo9n94yd07ubMOZdYXigKPS7Xp2+DBdh7ybSYlsYcJ5r3Ax2BLUopP6A8UAYoDVy4a7sw4BkzPF+WnIs+l/6pV2vNuRvnqFQ0e3dJynwK//rtt9/Ys2dP+iB6t2/fpnjx4gDY2dnRunVrAGrXrs2GDRseeIzu3bsD0KBBA27evMmNGzdYv34969atSz/3EB8fz/nz5wFo1qwZrq6uQMbtKXLRmjXEDRvIsBpxLAlRFLGPYbSLGwEpg/GeNlFuQrNQ5giFGcAHSql9wEFgL5Dy8F3+SykVAoQAlCtX7qHbZvaJPjwmnIpzK6JJCwU01+Ov82XnLynh9PjjDcl8CvfW3adPH95+++3/rLO1tU2vx9raOsNzAOq+Nw2lFFprVq9ejaen5z3rduzYcU/7CwOFh8PgwWzY+w09ezhytUAcL7krup1vQo+eH2NTVqbFtGTZvvpIa31Ta91Xa+1L6jkFN+A0cBEoe9emZdKWZXScUK11Ha11HTc3t2zVNG3zNEz63hPBKTrFLOcW7njS51No0qQJq1at4urVqwBcu3aNc+fOZXl/gJUrVwKpn/pdXFxwcXGhRYsWzJs3Lz1M9+7d+8B9M2pPkYO0hiVLuF6zCh2tf6V5H42NaxwTi5VinuMH9P6/XyUQ8oFs9xSUUoWBOK11IhAMbNZa31RK7QIqKaUqkBoG3YAe2X2+rNgetp3ElMR7liWmJLItLPN5CrLqzvwFbm5u1KlTh9jY2Idu36lTJ3777Te8vLwoW7bsf+ZTGDp0KNHR0SQnJzN8+HC8vb0feryRI0cSHR1Nr169WL58eYb1dOvWjX79+jF37tz0E9ADBgzA0dGR7du3p8+nUKJEiUeaT8HLy4u33nqL5s2bYzKZsLW15cMPP6R8+fJZPoaDgwM1a9YkKSkp/RzKxIkTGT58ONWrV8dkMlGhQgW+//77LLenyCGnT0NICCsvbSQkyJZYuwReKWXNK+deplPwYqyKZu+DnMhDtNYP/QFWAOFAEqnnBYKAAcCAtPXPAseBY8AaoMhd+7ZKW3cKmJDZc935qV27tr7f4cOH/7PM0sTExGittY6MjNQVK1bU4eHhBldk2bLanvnhd8cwyclav/uuvlTMQTfqXUgzBf30bPT0ORX0hTWfG12duAuwW2fxPfZhP1m5+qh7Juu3A5UzWPcj8GPm0fRkkPkUzEvaM4cdOIAODmKBaR+vvQopNvH0LW1Lh3OdaT02FFUw4yvwhOWSYS5ykaXMp2ApcznIeYQckpAAb73FyY/epkuHAuwtlUwNF+idXJVeFWfhFvSy0RWKHCShkEcZOZ+CzOXwBNu2jeR+Qbztepppr2psbWMYXMqR9hd70XjsPJRdxvf6iPzBokJBa/2fyxiFeBidB+cgz5NiYmD8ePatms8rXQpy0jWR54tCt5ha9Kz+AS6BzxtdocglFhMKDg4OREVFUbRoUQkGkSVaa6KiotLv5RAZ+Oknbg8KYWylSD7sr3Cxu8WYEs60jQrhubEzwUrGzXySWEwolClThrCwMCIiIowuRVgQBwcHypQpY3QZeVNkJIwYwaYtX9CjsyPhzvG8VAI6XKmP//OLKFC5mtEVCgNYTCjY2tpSoYLcGCNEtmkNX35J9GtDGFg3jv/1hVIOt5lUrCjtEoZTa+IEGaLiCWYxoSCEMIMLF2DgQL498T2Bvey54ZDAK6WhzcWmdH3pY+xKeRhdoTCYfFkoxJPAZIKFC7lctyotC/1Oh+5QpGgCb5UsyRT7+fSavEECQQDSUxAi/zt+HB0cxCcxfzIs2JYkuyT6lrWi5fnWdApajHURGaJC/EtCQYj8KikJ3n2X03Mm0+NlG3aUg+ouSfSx96C96zQq9u1pdIUiD5JQECI/+vtvkoMDedfhIBNDwMY2kSHlbWhy9hXajA7FqoAMUSEeTEJBiPzk9m2YOpUDn82kWwd7jhQ3Ub8odE/xpEPZ2ZTu3droCkUeJ6EgRH6xeTPxIYFMKnOWd0M0zra3GVvOnkYXetPitfkoWxmiQmROQkEIS3fzJowdy5YfF+HfyYELLim0cIcOt2rQyWs+xXrJEBUi6yQUhLBkP/zAzSEhDPeO4NNAcLeP583STjSI6E/D4e+grK2NrlBYGAkFISxRRAQMG8b3e1bQt7MdUQWT6FwaXoqsR+e6iyhUpYbRFQoLJTevCWFJtIbly7lay5MOKatp0wOc3BKZUaEIo5KmEDh2mwSCyBbpKQhhKS5cQA/oz7KLPzG4tw3xdsn09YAXwxrTucliHEvL2GAi+yQUhMjrTCb46CPOTn+N3k2T2eIH3oWSCS7sTiP1Or4ThhldochHJBSEyMuOHSOlXzDzEv9kXF9rlJ2JIR6K+udepmOfxdi5uhtdochnJBSEyIvShqg4NH8S/q2tOFASnnFNobdjORo7TaXKG32MrlDkUxIKQuQ1e/eSEBzAtEIHmBGkKGgL4ypaU/dMJ9oFfox1wULIAzrKAAAcZ0lEQVRGVyjyMQkFIfKKtCEqtq2YSc92NpxxhWbFNZ3V0zQvPguPHu2NrlA8AbJ0SapSaolS6qpS6lAG612UUt8ppfYrpf5RSvW9a93MtGVHlFJzlUywLMR/bdlCTJ3qvHpgJs8HmIgtkcQ0TzuGRgcSHHgIj6YSCCJ3ZLWnsBSYDyzLYP0g4LDWuo1Syg04ppRaDtQBngOqp233J9AQ2PS4BQuRr9y8Ca+/zo8bFhDYzparTibal4bWt71p6fEBpbo1NrpC8YTJUihorTcrpTwetgngnNYLcAKuAclpyx0AO0ABtsCVbNQrRP7x449EDO/HoOpX+NofyjkmM6tcAapfCqbpsPdkiAphCHOdU5gPrAMuAc5AV621CdiulNoIhJMaCvO11kfM9JxCWKbISPSI4fxv/3IGdbIh1sFEn/Lw4rXatK62kKLd6hhdoXiCmWuYixbAPqAU4AvMV0oVUko9DVQFygClgcZKqRcedAClVIhSardSandERISZyhIiD9EaVq7k3DOeNGclPTtBKbdk5lR2pu+tCfQevoOi3hIIwljm6in0BWZorTVwUil1BqhC6vmDv7TWsQBKqZ+AZ4Et9x9Aax0KhALUqVNHm6kuIfKGixdJGfgqCy5/x5juVmg7zeCK8MzFBrSrH4pzeU+jKxQCMF9P4TzQBEAp5Q54AqfTljdUStkopWxJDQn5+kg8OUwmCA3l8POePFP8J4a2gmrFTXzwVFF6Jr5Dz7F/SCCIPCVLPQWl1AqgEVBMKRUGTCb1pDFa60XANGCpUuogqecOxmqtI5VSq4DGwEFSTzr/rLX+zuyvQog8JjwmnG5ftOPzb635NOEv3uqlcLBVjK8MPqda0L7bYhyLlzG6TCH+I6tXH3XPZP0loPkDlqcA/R+vNCEsVHIy0+Z2YkvSLqrXVEQ7QuPimh4FSlJXTaL6ePmTEHmX3NEshDkdOMCpIf6ENjyEtoZoR83YylD7TAfa91yMrbOr0RUK8VAyyY4Q5pCQAJMm8XunmtR47h9S0m4xsAYu3GjGK+PXSCAIiyChIER2/fUXN/1q0G/vWzTpaeKW/b8Xz6UA31z7k8uxl42rT4hHIKEgxOO6dQuGD+en3s9SudkpPqmjeapgau/gbik6hWl/TDOkRCEelYSCEI/j11+5Vqsqvc7No5U/2LuZeM/LHh1XlJT7Nk1MSWRb2DZDyhTiUcmJZiEexfXrMHo032xbQnB7G24UMNGrHDSJqUaLpz9k+CvPGV2hENkioSBEVn3zDVdH9mdA3Wt80w2eKpDClPIFqBo+gCZDZqGspOMtLJ+EghCZuXIFPWQwXx5ZxYBuNsQ5mAjygAZRfrT2DcW1S/VMDyGEpZCPNkJkRGtYtoxLdTxpZfstPTpDqWLJvF+5EAHxU+g1YjuulSUQRP4iPQUhHuT8eXT/EJZe/oXBva1JsjfxagWof6kR7V5YjHOZp4yuUIgcIaEgxN1MJli4kHP/N4Y+TZP5ox5UL5RCv2JuPMPr1B07wugKhchREgpC3HHsGKbgIBbFb2VUoDXa1sSwp8Dv/Et0bPUJDkVLGl2hEDlOQkGIpCR4911OfjAZ/5dhZ1moUySFvs6leMFxKtVeDzK6QiFyjYSCeLLt3UtKUCBz7Pczvp/CxlYzqqLimXMd6RD0CTYFXYyuUIhcJaEgnkzx8TBtGoc/mUH39rYcKKmpX1TT064CTYvNpJJ/Z6MrFMIQEgriybN1K0n9gphR7DhT+yscbRMZV9GGZ853p82Ij7C2dzS6QiEMI6EgnhyxsTB+PPu+nke3Tg4cc9M0dNN0w5OXy8+lbI//zBMlxBNHQkE8GdavJ2FAP6Z4XGRmf4WLXQJvlLfj2fAgXhoxF2UtfwpCgISCyO+uX4eRI9m5YSldOztwtkgKzd2hU3x12nkvxN2/vtEVCpGnSCiI/Oubb7g95FXGeV9jXjAUtY9ncpkCNLgxiBeHzpAB7IR4AAkFkf9cuQKDB/PnzlV07erApUJJtC4J7W4+Q+d6H1O4UjWjKxQiz5KPSiL/0Bo+/5zYGlUJuv0dDfqCyS2eqRUKMY6pBI/+SwJBiExIT0HkD+fPw4ABbDj2Ez17OxBRMIEOpaF1ZEO6NPmUgqUrGF2hEBYh056CUmqJUuqqUupQButdlFLfKaX2K6X+UUr1vWtdOaXUeqXUEaXUYaWUh/lKF4LUAewWLCC6phc9HDbRvDfYF4tnWtmijLd/n77jNkkgCPEIstJTWArMB5ZlsH4QcFhr3UYp5QYcU0ot11onpu0zXWu9QSnlBJjMUbQQAJw4AcHBfB++md797LnhmEDXMvDylZZ0afcp9kVLGF2hEBYn056C1nozcO1hmwDOSikFOKVtm6yU8gJstNYb0o4Tq7WOM0PN4kmXnAwzZxLlV412JXbTxh8KF0tgeqmSTCyyhF7jf5JAEOIxmeOcwnxgHXAJcAa6aq1NSqnKwA2l1BqgAvArME5rnWKG5xRPqgMHIDCQr+L20G+gHbfs4uhVVtEqvAOdu3+CjVNhoysUwqKZ4+qjFsA+oBTgC8xXShUiNXBeAEYDdYGKQEBGB1FKhSildiuldkdERJihLJGvJCTApElcaVCL5lWO0bUruLsmMr14eSaX+ZpuE1ZLIAhhBuboKfQFZmitNXBSKXUGqAKEAfu01qcBlFLfAvWATx50EK11KBAKUKdOHW2GukR+sWMHOrAvS22OMWSwNYl2sQSWtab15e60GxyKlQxgJ4TZmCMUzgNNgC1KKXfAEzgNXAcKK6XctNYRQGNgtxmeTzwp4uLgjTcI++R9unVyZmt5E96FTARYP023ygso07eZ0RUKke9kGgpKqRVAI6CYUioMmAzYAmitFwHTgKVKqYOAAsZqrSPT9h0N/JZ2EnoP8HFOvAiRD23ciA4OYkGRC4weZoO2jSGktB1tIwNoNfRDGcBOiByS6V+W1rp7JusvAQ8cczjtyqPqj1eaeCJFR8OYMZz5KpRXXnFmT+lkfF2gd4oPPWt+hFtNGcBOiJwkH7dE3vHDD5j6hzC7TBQTh1pjYxvDwFKOdLw5iMYj3pEB7ITIBRIKwniRkTB8OMd/Xk7HroX4p3gCdYtAz9t16PP8Elwqy3hFQuQWCQVhHK3h669JGTKIqZ5xvD3YCnubmwwt4UzXpJHUHzIZlDK6SiGeKBIKwhiXLsGgQRza+i0duhfipGsczxWFHjefJ6DlZxQoU9HoCoV4IsmXtCJ3aQ1LlpDkU5VRMb/iO1AR4X6TESWLMNdpNgPHb5FAEMJA0lMQuefsWQgJYc/BDXTs68z5QrG86AY9oprSu+My7IqVNLpCIZ540lMQOc9kgnnziK/hzQCbnfj1V9wqFsNrxYvzYbFQgidukEAQIo+QnoLIWceOQVAQf57bRpf+BQkvGE2L4ooeEW3w7/kZ1s5FjK5QCHEX6SmInJGcDDNmEFe7Or2LHaZBsCbFNZZxrqVZWH4FvSetk0AQIg+SnoIwv/37ITCQDVH78R9iT4TDdVq7W9MzohOvBC/ByrGg0RUKITIgPQVhPmnDW8fUr02np87RvG8KtoXjeKNQBT6qso6uE1dKIAiRx0lPQZjHjh0QGMjaxJP0HW7HDbso2rvbEhDVk7YjF6Fs7YyuUAiRBRIKInvi4mDiRG4sfJ/uHYryc+VEyhWAYXgyqPbHFKv7gtEVCiEegYSCeHx//AFBQSy3u8TAUXbE2kTySnEHgmOCaTZqDsra2ugKhRCPSEJBPLqbN2HsWCKXLaJTFzc2e9ymYkEYk1CdIQ0/pZBXLaMrFEI8JgkF8Wh+/hkd0o+PXaMZNcqOeJsIuhcryMDEwTw/6m0ZwE4ICyehILLm2jUYMYLwNcto38ONnaViqOIMgTF+DH7pMxwrVDG6QiGEGUgoiMytXo0eNJD3yicxaZQtSVYR9HJ1YZjNaGqPmCC9AyHyEQkFkbErV2DwYM6tX0XbXsU44HYd70LQ78bzvNrxC+xKlTe6QiGEmcnNa+K/tIYvvkB7VeXNyxvxHGHNcfdIAoq48pXrBwx7c4sEghD5lPQUxL0uXIABAzi2/Sfa93HlaOEofF0U/a81pZ//cqyLFje6QiFEDpKegkilNYSGkuLjxWvxu6k+THG+aBTBhdxZU3oxA6ZukEAQ4gkgPQUBp09DcDD7Dv5JpxAnTjtdpW5hKwZFtab3sC9Qzi5GVyiEyCVZ6ikopZYopa4qpQ5lsN5FKfWdUmq/UuofpVTf+9YXUkqFKaXmm6NoYSYpKTBnDsnVvHnV8Sh1BycTUfg6rxYow7eVVtJn6ncSCEI8YbLaU1gKzAeWZbB+EHBYa91GKeUGHFNKLddaJ6atnwZszlalwryOHIGgIP46s5cuQ+y54BhO/cI2DL3WgS4jlqIKFDC6QiGEAbLUU9BabwauPWwTwFkppQCntG2TAZRStQF3YH32ShVmkZQEb79NYq0a9HY/z/MDEogtFM1Quwqsq/EdXd/8SgJBiCeYuc4pzAfWAZcAZ6Cr1tqklLIC3gV6Ak0fdgClVAgQAlCuXDkzlSXusW8fBAbyW+QJeo10INzuIg0L2zHyRjfajAtF2dsbXaEQwmDmuvqoBbAPKAX4AvOVUoWAgcCPWuuwzA6gtQ7VWtfRWtdxc3MzU1kCSJ/8Jr5eHTpVjqR5UCxJTjGMUp58V/9X2k7+TAJBCAGYr6fQF5ihtdbASaXUGaAK8CzwglJqIKlfK9kppWK11uPM9LwiM3cmv0kIJ+Q1B67aXKCJiwOv3wqgyfh5YCMXoAkh/mWud4TzQBNgi1LKHfAETmut/e9soJQKAOpIIOSSuDiYPJnYue/SpWtZfn7qOsXt4fW4akxs/CmO1WsbXaEQIg/KUigopVYAjYBiSqkwYDJgC6C1XkTq1UVLlVIHAQWM1VpH5kjFInObN0NQEF/Y3mD4OAeirM7TspATk5Nfpd6UGWAl9ywKIR4sS6Ggte6eyfpLQPNMtllK6qWtIqfExMC4cdz4ZAEdepVlU5lISjvAm9G1eL31F9hWqmp0hUKIPE6+UM4v1q+Hfv1Y5JrI6+Psuaku0MbJhWl2w6gxZooMby2EyBIJBUt3/TqMGsXlLz+jY0Aptrtfpryj4vWoZxnVdznW5SoYXaEQwoLIl8uWbO1a8PZm9uENeI61Zod7GO0di7KhyCzGzNgqgSCEeGTSU7BEEREwdCjnvltNx2A3/i4SRsUCirciGjK4//9QJUoZXaEQwkJJT8GSaA0rV6K9qjLl0l/4jNEcdL1EF7vibCr5IUNmbpJAEEJki/QULEV4OAwcyLHff6FzPxcOOZ/F09GaMVeb03fc/1BFixpdoRAiH5CeQl6nNXz2GdqrKqPiDlJzVALHXS7jb1WaLRWXEjjrFwkEIYTZSE8hLzt/Hvr35+9d2+jR355jjqfwLmDDhCsv0+2Nz1EuMteBEMK8pKeQF5lM8NFHpHh7M8D2FM8NjeFcwQgCTOXZ5v0V3Wetk0AQQuQI6SnkNWlTY/55ZD8Bw+w4ZXuCGo52TI1qR9uJn0LBgkZXKITIx6SnkFekpMAHH5BczYfexS7S5NXrXHa4Rv+Ep9he5zvazvhKAkEIkeOkp5AXHD0KQUH8HHaaAaPsOGd9nNqODrxzoytNJi4ER0ejKxRCPCGkp2Ck5GR45x3ia9akc8VI2gRd5rp9NMNuebL9+fU0mb5UAkEIkaukp2CUgwehb1++vhnByHE2hHGcevYFmXO7J8+8NRfs7IyuUAjxBJKeQm5LTISpU4mpW5fWNW/S3f88t2xjGRvtzZ8t/uCZKYskEIQQhpGeQm7aswcCA1mqYxg/3opwfYIX7ArxoSmIajNnytSYQgjDSU8hN8THw/jxRD33As2ev0VQpzMk2cbz5rUa/NFuG9UmvCeBIITIE+SdKKdt3w6Bgcxz0rw1wcRV0yka2xThI9uBPP3em2BtbXSFQgiRTkIhp8TFwRtvcHHhx/QY4MaWwmcobqOYdbE2o4Z/iXr6aaMrFEKI/5BQyAl//AFBQfxfKXven5BAVMoZmlOMxc4jKDN3HFjJt3ZCiLxJQsGcYmJg3DhOfv4/evV35i+nU5SytmbBxXoMeH0llCtndIVCCPFQ8pHVXDZsQPtUY8LxLfiNiWGn0wXaJLtzwO1dBizYJoEghLAI0lPIruhoGD2aA6vXETjAhj32BylnbcOcsBfoPelLKCUzoQkhLEemPQWl1BKl1FWl1KEM1rsopb5TSu1XSv2jlOqbttxXKbU9bdkBpVRXcxdvuB9+QHt5M+zKLhqMjGSfwyU6xZfin3IL6b3wDwkEIYTFyUpPYSkwH1iWwfpBwGGtdRullBtwTCm1HIgDemutTyilSgF7lFK/aK1vmKNwQ127BsOGse3XTQzsl8R+6/1UsLZlycXGdJzyBbi7G12hEEI8lkx7ClrrzcC1h20COCulFOCUtm2y1vq41vpE2jEuAVcBt+yXbLA1a0iq6kVI4iFaDLrIYZur+MeU5fBTS+i4cIMEghDCopnjnMJ8YB1wCXAGumqtTXdvoJTyA+yAUxkdRCkVAoQAlMuLJ2WvXoUhQ9iwfRcjByZxiH1UsnJg3qUXaTHtc5B5koUQ+YA5rj5qAewDSgG+wHylVKE7K5VSJYHPgb73h8XdtNahWus6Wus6bm55qEOhNaxYQXzVavRyOEr7fmc4YXWNoGvl+Mf7C1os+FECQQiRb5ijp9AXmKG11sBJpdQZoAqwMy0cfgAmaK3/MsNz5a7wcHj1Vb45fIzxwxM4ajqAl5UjoZdb8ty0JVC4sNEVCiGEWZmjp3AeaAKglHIHPIHTSik74BtgmdZ6lRmeJ/doDUuXEuNdky7up+nR6yjniGbIlQocqLOK5+atkUAQQuRLmfYUlFIrgEZAMaVUGDAZsAXQWi8CpgFLlVIHAQWM1VpHKqV6Ag2AokqpgLTDBWit95n9VZjThQsQEsKyixeZNiqWk8lXqK6dWBr1MjXf+RicnY2uUAghckymoaC17p7J+ktA8wcs/wL44vFLy2Vaw8cfEzluCsH+Rfjp2cPYasXYsKf4vx6hWL3Y2OgKhRAix8kdzQBnzkBwMAtirvPu6OucTgqntqkQy292wHPOh1CwoNEVCiFErniyxz4ymWD+fMLqNODlmmEMa72XSFMC085WYlezH/GcvVQCQQjxRHlyewonT6IDg5it4vlw9FXOJSZSP7EI/0vuQvkF74Ojo9EVCiFErnvyQiElBT74gONvz2dwsBW/OZzCJcWK9054MmLoMvDzM7pCIYQwzJMVCkePYuobxFQXE4tHXuBiYjKNbhflS9ueuH/yDtjbG12hEEIY6skIheRkmD2bvXM+YWRIIn9Yn8c1xZrQI1XpN3Y51KxpdIVCCJEn5P9QOHSIpIAgJpS14vNhp7mcaKJFTDFWOAdSZNk0sLMzukIhhMgz8m8oJCXBjBlsDV3B6/1usEWHUzzFhv8dqkr3SSugWjWjKxRCiDwnf4bC3r3E9+nHGB8bvhx4lMhETbtrbnzu/irOKyaCTf582UIIkV35690xIQHeeotf/reOqUGX2JYUSalkO749UIW2b30JVasaXaEQQuRp+ScUdu0iNuBVRtWzZlXQAW4kQbfLxVny9HAcvxoD1tZGVyiEEHme5YdCfDxMnsyadb8xs88pdiTcoFySA18fqErjGSuhUiWjKxRCCIth2cNcbNtGlG99AmJ+I7DnHvYk3iDwfHGOF5lO4693SyAIIcQjssyeQlwcvPEGyzb+xdzAE+y5HUvFREd+PlSNerNWQMWKRlcohBAWyfJ6Cps3c6lmA/z1RgZ33s6B+FgGnyzOsRKzqLfqLwkEIYTIBsvpKdy6hR73Ogv37OXj4MPsi7uNZ3xBVh6pTo33voRy5YyuUAghLJ5l9BQ2buRMrcZ0Lfg7r7X6k6O34xl3uDiHPeZQ4+utEghCCGEmebunEBOD6bWxvHfiMJ8F7+NQXCI+cU6sPlGbynOWQ+nSRlcohBD5St7tKaxfz8G6Lehc/FcmNvqDU7eTmLrPjQOe86n81UYJBCGEyAF5sqcQE7OHZcktmNkf/rkJtWILseaMH+UXLIOSJY0uTwgh8q08GQrXEiF4NzhYw/gq8FbKQtSM7qCU0aUJIUS+lidDITIBXigKwyuBqx2oRj2MLkkIIZ4ISmttdA3/4eKidIkS/z4+fpw9xlVjuGJApNFF5AHSDv+StviXtMW/PLXWztk9SJ7sKdy8yZ7oaF3H6DryAqXUbq2lLaQd/iVt8S9pi38ppXab4zh59+ojIYQQuU5CQQghRLq8GgqhRheQh0hbpJJ2+Je0xb+kLf5llrbIkyeahRBCGCOv9hSEEEIYINdCQSlVVim1USl1WCn1j1Jq2AO2aaSUilZK7Uv7mXTXupZKqWNKqZNKqXG5VXdOyE5bZGVfS5Ld34u09dZKqb1Kqe9zr3LzM8PfSGGl1Cql1FGl1BGl1LO5+wrMxwxtMSJtv0NKqRVKKYfcfQXmk9W/+bT22Je2zR93LX+0906tda78ACWBWmn/dgaOA173bdMI+P4B+1oDp4CKgB2w//59Leknm22R6b6W9JOdtrhr/Ujgfw/bxhJ+stsWwGdAcNq/7YDCRr8mI9oCKA2cARzTHn8FBBj9mnK4LQoDh4FyaY+Lp/33kd87c62noLUO11r/nfbvGOAIqf/zssIPOKm1Pq21TgS+BNrlTKU5Lzttkc12zHOy+3qUUmWAl4HFOVNh7slOWyilXIAGwCdp+ydqrW/kVK05zQy/5zaAo1LKBigAXDJ/lbkji23RA1ijtT6ftt3VtOWP/N5pyDkFpZQHUBPY8YDVzyql9iulflJKeactKw1cuGubMCz4jfBuj9EWWd3X4jxmW8wBxgCmnK8w9zxGW1QAIoBP075KW6yUKpg71easR20LrfVFYDZwHggHorXW63Op3Bz1kLaoDBRRSm1SSu1RSvVOW/7I7525HgpKKSdgNTBca33zvtV/A+W11jWAecC3uV1fbspOW2Syr8V5nLZQSrUGrmqt89UwKI/5e2ED1AIWaq1rArcAiz73Bo/9e1GE1E/DFYBSQEGlVM/cqzpnZNIWNkBtUnvNLYCJSqnKj/M8uRoKSilbUl/Ucq31mvvXa61vaq1j0/79I2CrlCoGXATK3rVpmbRlFisbbZHpvpYmG23xHNBWKXWW1G5xY6XUF7lXuflloy3CgDCt9Z1PkKtIDQmLlY22aAqc0VpHaK2TgDVA/Vws3eyy8DcfBvyitb6ltY4ENgM1eIz3zty8+kiR+n3nEa31exlsUyJtO5RSfmn1RQG7gEpKqQpKKTugG7Audyo3v+y0RVb2tSTZaQut9eta6zJaaw9Sfyd+11pb7CfCbLbFZeCCUsozbdMmpJ54tEjZfL84D9RTShVIW9+E1O/hLVIW/+bXAs8rpWyUUgWAZ0h9zY/83pmbA+I9B/QCDiql9qUtGw+UA9BaLwI6A68qpZKB20A3nXoKPVkpNRj4hdSz6Uu01v/kYu3m9thtoZR6/kH7pn1SskTZ+b3Ib7LbFkOA5Wl//KeBvrlZvJllpy12KKVWkfr1UjKwF8u+8znTttBaH1FK/QwcIPX82mKt9SGAR33vlDuahRBCpJM7moUQQqSTUBBCCJFOQkEIIUQ6CQUhhBDpJBSEEEKkk1AQQgiRTkJBCCFEOgkFIYQQ6f4f6YFQbDMUmVAAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def f(x, y):\n",
    "    return x / y\n",
    "\n",
    "a, b = 2.0, 2.6\n",
    "h = 0.1\n",
    "y0 = 1\n",
    "h_min=0.001\n",
    "h_max=0.5\n",
    "eps=1e-8\n",
    "\n",
    "def actual_solution(x):\n",
    "    return (x**2 - 3) ** (1/2)\n",
    "\n",
    "#  def __init__(self, f, a, b, h, y0, h_min, h_max, eps, actual_solution):\n",
    "q2 = Question(f, a, b, h, y0, h_min, h_max, eps, actual_solution)\n",
    "q2.solve()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$\n",
    "\\int_0^1\\frac{sin t}{t} dt\n",
    "$$\n",
    "\n",
    "转化为：\n",
    "\n",
    "$$\n",
    "\\begin{cases}\n",
    "y'(x)=\\frac{\\sin x}{x}\\\\\n",
    "y(0) = 0\\\\\n",
    "\\end{cases}\n",
    "\\quad 0 \\le x \\le 1\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "By RK4: 0.946083076517732\n",
      "Actual: Si(1)=0.946083070367183\n"
     ]
    },
    {
     "data": {
      "text/latex": [
       "$\\displaystyle \\text{True}$"
      ],
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import math\n",
    "import sympy as sp\n",
    "\n",
    "def f(x, y):\n",
    "    return math.sin(x) / x\n",
    "\n",
    "a, b = 1e-64, 1\n",
    "h = 0.1\n",
    "y0 = 1e-64\n",
    "\n",
    "# 用 RK4 求解\n",
    "rs = runge_kutta(f, a, b, h, y0)\n",
    "I = list(rs)[-1][-1]\n",
    "print(\"By RK4:\", I)\n",
    "\n",
    "# 用 sympy 求解析解\n",
    "x = sp.Symbol('x')\n",
    "actual = sp.integrate(sp.sin(x) / x, (x, 0, 1))\n",
    "print(f\"Actual: {actual}={float(actual)}\")\n",
    "\n",
    "abs(actual - I) < 1e-6"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "改进 RKF：使用数组储存各种常数："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "def rkf(f, a, b, h_min, h_max, y0, eps):\n",
    "    \"\"\"Runge-Kutta-Fehlberg 方法（RKF）\n",
    "\n",
    "    用 **Runge-Kutta-Fehlberg 方法**求如下常微分方程初值问题的数值解:\n",
    "\n",
    "        y'(x) = f(x, y)  (for a <= x <= b)\n",
    "        y(a) = y_0\n",
    "\n",
    "    This function returns a generator that does lazy calculations，\n",
    "    which generates solutions (x, y) of the equation for x from a to b by step h.\n",
    "\n",
    "    Args:\n",
    "\n",
    "        f: 二元函数，y'(x) = f(x, y)\n",
    "        a, b: float, x 的区间端点\n",
    "        h_min: float, 最小步长\n",
    "        h_max: float, 最大步长\n",
    "        y0: float, 初值 y(a)\n",
    "        eps: float >= 0，容许误差\n",
    "\n",
    "    Yields:\n",
    "\n",
    "        (x, y)：方程的解 for x from a to b, step h.\n",
    " \n",
    "    Raises:\n",
    "\n",
    "        ValueError: (b > a) or (h_max < h_min) or (eps < 0)\n",
    "        GeneratorExit: h_min too small. Failed to continue.\n",
    "\n",
    "    \"\"\"\n",
    "    if b < a:\n",
    "        raise ValueError(\"unexpected range [a, b] where b < a\")\n",
    "    if h_max < h_min:\n",
    "        raise ValueError(\"unexpected step h_max < h_min \")\n",
    "    if eps < 0:\n",
    "        raise ValueError(\"unexpected eps < 0\")\n",
    "\n",
    "    h = h_max\n",
    "\n",
    "    x = a\n",
    "    y = y0\n",
    "\n",
    "    CH = [0, 1 / 4, 3 / 8, 12 / 13, 1, 1 / 2]\n",
    "    CK = [[], \n",
    "          [1 / 4], \n",
    "          [3 / 32, 9 / 32], \n",
    "          [1932 / 2197, - 7200 / 2197, 7296 / 2197], \n",
    "          [439 / 216, -8, 3680 / 513, - 845 / 4104], \n",
    "          [- 8 / 27, 2, - 3544 / 2565, 1859 / 4104, - 11 / 40]]\n",
    "    CR = [1 / 360, 0, - 128 / 4275, - 2197 / 75240, 1 / 50, 2 / 55]\n",
    "    CY = [25 / 216, 0, 1408 / 2565, 2197 / 4104, - 1/5, 0]\n",
    "\n",
    "    yield (x, y)\n",
    "\n",
    "    while x <= b:\n",
    "        k = [0] * 6\n",
    "        for i in range(6):\n",
    "            k[i] = h * f(x + CH[i] * h, y + sum( (CK[i][j] * k[j] for j in range(i)) ))\n",
    "\n",
    "        R = abs(sum(CR[j] * k[j] for j in range(6)))\n",
    "\n",
    "        if R <= h * eps:\n",
    "            x = x + h\n",
    "            y = y + sum((CY[j] * k[j] for j in range(6)))\n",
    "            yield (x, y)\n",
    "\n",
    "        delta = 0.84 * (eps * h / R) ** (1/4)\n",
    "\n",
    "        if delta <= 0.1:\n",
    "            h = 0.1 * h\n",
    "        elif delta >= 4:\n",
    "            h = 4 * h\n",
    "        else:\n",
    "            h = delta * h\n",
    "\n",
    "        if h > h_max:\n",
    "            h = h_max\n",
    "\n",
    "        if abs(x - b) < eps:\n",
    "            break\n",
    "        \n",
    "        if x + h > b:\n",
    "            h = b - x\n",
    "\n",
    "        if h < h_min:\n",
    "            raise GeneratorExit(\"h_min too small. Failed to continue.\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\t0.5\tTrue\n",
      "0.13654362227564565\t0.7185790374592727\tTrue\n",
      "0.26801219081330985\t0.9541735174017452\tTrue\n",
      "0.4012266303587918\t1.2166084183124863\tTrue\n",
      "0.5366174380042972\t1.5060873731815065\tTrue\n",
      "0.6747628968884856\t1.8230474939934167\tTrue\n",
      "0.8164946373323174\t2.168375874068474\tTrue\n",
      "0.9630852685666529\t2.5438210903873912\tTrue\n",
      "1.116667783483466\t2.9529541199123077\tTrue\n",
      "1.2813817240613252\t3.403897243193893\tTrue\n",
      "1.467877999576984\t3.920415171944022\tTrue\n",
      "1.6626480911242003\t4.453068120494154\tTrue\n",
      "1.8154680775243754\t4.8548864817086885\tTrue\n",
      "1.9677068583935844\t5.230159855136686\tTrue\n",
      "2.0\t5.30547384382613\tTrue\n"
     ]
    }
   ],
   "source": [
    "rs =rkf(lambda x, y: y - x**2 + 1, a=0, b=2, h_min=0.01, h_max=0.5, y0=0.5, eps=1e-6)\n",
    "\n",
    "rs_old = runge_kutta_fehlberg(lambda x, y: y - x**2 + 1, a=0, b=2, h_min=0.01, h_max=0.5, y0=0.5, eps=1e-6)\n",
    "\n",
    "for r in rs:\n",
    "    ro = next(rs_old)\n",
    "    sim = abs(r[0] - ro[0] + r[1] - ro[1]) < 1e-6\n",
    "    print(r[0],r[1], sim, sep='\\t')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "file_extension": ".py",
  "kernelspec": {
   "display_name": "Python 3.7.6 64-bit",
   "language": "python",
   "name": "python37664bit8b61c5f9b63a430188c2e600c83aebf6"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  },
  "mimetype": "text/x-python",
  "name": "python",
  "npconvert_exporter": "python",
  "pygments_lexer": "ipython3",
  "version": 3
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
